package com.zjj.learn.designmodel.work.decorator;

public class DecoratorTest {

    public static void main(String[] args) {
        //初始化一杯卡布奇诺咖啡
        KabuqinuoCoffee kabuqinuoCoffee = new KabuqinuoCoffee();
        String kabuqinuoCoffeeName = kabuqinuoCoffee.getName();
        Double kabuqinuoCoffeePrice = kabuqinuoCoffee.getPrice();
        System.out.println("kabuqinuoCoffeeName = " + kabuqinuoCoffeeName);
        System.out.println("kabuqinuoCoffeePrice = " + kabuqinuoCoffeePrice);

        System.out.println("============================");
        //初始化一杯牛奶咖啡，在卡布奇诺的基础上加牛奶
        MikeCoffee mikeCoffee = new MikeCoffee(kabuqinuoCoffee);
        String mikeCoffeeName = mikeCoffee.getName();
        Double mikeCoffeePrice = mikeCoffee.getPrice();
        System.out.println("mikeCoffeeName = " + mikeCoffeeName);
        System.out.println("mikeCoffeePrice = " + mikeCoffeePrice);
    }


    /**
     * 谈谈对装饰者模式的使用
     *
     *   装饰器模式是一种结构型设计模式，它允许通过将对象放入包装器中来为原始对象增强功能。
     *   这些包装器（称为装饰器），能够在不改变原始对象代码的情况下，动态地为其添加新的行为和属性。
     *
     * 装饰器模式由 4 部分组成：
     *   1、抽象构建
     *   2、具体构建
     *   3、装饰器
     *   4、具体装饰角色
     *  在生活中我们需要提供一个咖啡点单系统。
     *  咖啡提供了描述信息个获取获取价格，如果说 我们提供了加牛奶的服务，在计算价格时就得床架很多相应的牛奶咖啡类了。也会出现类爆炸
     *  这时就可以使用装饰着模式解决这个问题。
     *    我们提供一个咖啡装饰器，使用装饰器模式做明显的特征就是 装饰器需要实现被装饰的产品，同时也需要将产品组合到装饰器中。
     *
     *  具体参案例请看使用：{@link com.zjj.learn.designmodel.work.decorator.DecoratorTest#main(String[])}
     *     其中抽象构建是：{@link com.zjj.learn.designmodel.work.decorator.Coffee}
     *     其中具体构建是：{@link com.zjj.learn.designmodel.work.decorator.KabuqinuoCoffee}
     *     其中装饰器是：{@link com.zjj.learn.designmodel.work.decorator.CoffeeDecorator}
     *         装饰器的作用是做具体构建进行进一步的升级，所以说我们需要获取具体的产品，并且返回产品封装之后的信息
     *         所以说，就需要将抽象构建组合【聚合也合理】到装饰器，同时装饰器也需要实现或者继承抽象构建，这样子在后续
     *         的具体装饰角色在创建的时候就可以返回在抽象构建的基础上进一步升级了
     *     其中具体装饰角色是：{@link com.zjj.learn.designmodel.work.decorator.MikeCoffee}
     *        牛奶咖啡在咖啡的基础上进一步升级
     **/


    /**
     * 装饰器模式和桥接模式的区别
     * 装饰器模式和桥接模式在代码结构上还是比较相像的；同样都是结构型模式，在使用的目的和场景状态还是有很大的区别
     * 桥接模式：
     *     主要是将抽象部分和具体部分分离，让他们可以相互独立的变化。
     *     桥接模式通过一个桥接接口来实现两个抽象体系的相互调用【例如在案例中：电脑系统和文件解析就是两个体系】
     *
     * 装饰器模式：
     *    主要在不改变原有对象结构的前提下，通过创建一个包装对象，这样几月可以动态的为原有对象添加新的功能或者行为
     *      【例如在给定的案例中：牛奶咖啡就是在咖啡的基础上添加牛奶，同时价格和名字也跟着改变了】
     *
     * 二者最主要的区别：
     *     装饰器模式的应用场景通常是在需要在不改变原有类结构的情况下，为对象添加新的行为或功能。
     *     而桥接模式的应用场景通常是在需要分离抽象部分和实现部分，并且这两部分独立进行扩展和变化的情况下。
     **/


}
